package com.iprojectmanager.businessclass;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.iprojectmanager.entities.*;
import com.iprojectmanager.managers.*;


/**
 * @author Alucard
 */
public class ActivityControl extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException
    {
        String op = request.getParameter("Aceptar");
        String actividad = request.getParameter("actividades");
            if(op.compareTo("Crear") == 0)
            {
                saveActivity(request,response);
            }else if(op.compareTo("Eliminar") == 0)
            {
                deleteActivity(request,response);
            }else if(op.compareTo("Modificar") == 0)
            {
                updateActivity(request,response);
            }else if(op.compareTo("Aceptar")==0){
                updateAdvance(request,response,actividad);
            }else if(op.compareTo("Mostrar Informacion") == 0)
            {
                request.getRequestDispatcher("VistaLider").forward(request,response);
            }
    } 

    public void saveActivity(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    {
        HttpSession session = request.getSession();
        LiderProyecto lider = (LiderProyecto)session.getAttribute("user");
        String name = request.getParameter("tbNombreAct");
        String description = request.getParameter("taDescripcion");
        String priority = request.getParameter("prioridad");
        String iday = request.getParameter("diai");
        String imonth = request.getParameter("mesi");
        String iyear = request.getParameter("yeari");
        String fday = request.getParameter("diaf");
        String fmonth = request.getParameter("mesf");
        String fyear = request.getParameter("yearf");
        String idresponsaible = request.getParameter("responsable");
        String[] activities = request.getParameterValues("acividades");

            //Valida que se hayan ingresado datos
            if(name.compareTo("") != 0 && description.compareTo("") != 0 && iday.compareTo("") != 0 &&
               fday.compareTo("") != 0 && iyear.compareTo("") != 0 && fyear.compareTo("") != 0)
            {
                //Valida que la fecha no se anterior a la de hoy y no sea menor a la del proyecto
                Date initdate = new Date(Integer.valueOf(iyear)-1900,Integer.valueOf(imonth),Integer.valueOf(iday));
                Date enddate = new Date(Integer.valueOf(fyear)-1900,Integer.valueOf(fmonth),Integer.valueOf(fday),0,0,1);
                Date current = new Date();
                    current.setDate(current.getDate()-1);
                    
                if(initdate.before(current) == false &&
                   initdate.before(lider.getProyecto().getFechainicio())== false &&
                   initdate.before(enddate) == true)
                {
                    UserManager usermanager = new UserManager();
                    Actividad actividad = new Actividad(name,description,Integer.valueOf(priority),initdate,enddate);
                    ActivitiesManager ma = new ActivitiesManager();
                    //ActivitiesManager ma = new ActivitiesManager();
                        //Se valida que no exista dato
                        if(ma.getActividad(name) == null)
                        {
                            actividad.setProyecto(lider.getProyecto());
                            if(idresponsaible != null)
                            {
                                actividad.setResponsable((IntegranteProyecto)usermanager.getUsuario(Integer.valueOf(idresponsaible)));
                            }
                            IProjectManager manager = new IProjectManager();
                            manager.exec(actividad, IProjectManager.INSERT);
                            /*****************Se asignan dependencias y activdades sucesoras**************************/

                            long id = 0;

                                actividad = ma.getActividad(actividad.getNombre());
                                if(activities != null)
                                {
                                    Actividad aux;
                                    for(String sid : activities)
                                    {
                                        id = Long.valueOf(sid);
                                        if(actividad.getFechaInicio().before(ma.getActividad(id).getFechaEntrega()) != true)
                                        {
                                            aux = ma.getActividad(id);
                                            aux.getSucesoras().add(actividad);
                                            ma.exec(aux,IProjectManager.UPDATE);
                                            actividad.getDependencias().add(ma.getActividad(id));
                                            ma.exec(actividad,IProjectManager.UPDATE);
                                        }
                                    }
                                }
                        }
                   //Redireccionamos.
                   request.getRequestDispatcher("VistaLider").forward(request,response);
                }
                else
                {
                    try
                    {
                        response.getWriter().print("ERROR: La Fecha de Comienzo no puede ser menor a la actual");
                        response.getWriter().print((new Date()).toString());
                        response.getWriter().close();
                    }catch(Exception ex)
                    {
                        //request.getRequestDispatcher("VistaLider").forward(request,response);
                    }
                }
            }
    }

    public void updateActivity(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    {
        HttpSession session = request.getSession();
        LiderProyecto lider = (LiderProyecto)session.getAttribute("user");
        String idact = request.getParameter("tbid");
        String name = request.getParameter("tbNombreAct");
        String description = request.getParameter("taDescripcion");
        String priority = request.getParameter("prioridad");
        String iday = request.getParameter("diai");
        String imonth = request.getParameter("mesi");
        String iyear = request.getParameter("yeari");
        String fday = request.getParameter("diaf");
        String fmonth = request.getParameter("mesf");
        String fyear = request.getParameter("yearf");
        String idresponsaible = request.getParameter("responsable");
        String[] activities = request.getParameterValues("acividades");
        
            //Se valida que se hayan ingresado datos
            if(name.compareTo("") != 0 && description.compareTo("") != 0 && iday.compareTo("") != 0 &&
               fday.compareTo("") != 0 && iyear.compareTo("") != 0 && fyear.compareTo("") != 0)
            {
                Date initdate = new Date(Integer.valueOf(iyear)-1900,Integer.valueOf(imonth),Integer.valueOf(iday));
                Date enddate = new Date(Integer.valueOf(fyear)-1900,Integer.valueOf(fmonth),Integer.valueOf(fday));
                ActivitiesManager ma = new ActivitiesManager();
                UserManager usermanager = new UserManager();
                Actividad actividad = ma.getActividad(Long.valueOf(idact));

                //Valida queel dia no sea menor al actual o que no se haya modificado
                if((initdate.before(new Date()) == false && initdate.before(lider.getProyecto().getFechainicio())== false) ||
                  (initdate.before(actividad.getFechaInicio()) == false && initdate.after(actividad.getFechaInicio()) == false))
                {
                //Validar que las dependenciasno tengan fecha de terminacion posteriores a la actual
                //if
                    //Se valida que la fecha de terminacion sea mayor a la de inicio
                    if(initdate.before(enddate) == true || initdate.equals(enddate) == true)
                    {
                            actividad.setNombre(name);
                            actividad.setDescripcion(description);
                            actividad.setPrioridad(Integer.valueOf(priority));
                            actividad.setFechaInicio(initdate);
                            actividad.setFechaEntrega(enddate);
                            actividad.setProyecto(lider.getProyecto());
                                  if(idresponsaible != null)
                                  {
                                      actividad.setResponsable((IntegranteProyecto)usermanager.getUsuario(Integer.valueOf(idresponsaible)));
                                  }
                        /*****************Se asignan dependencias y activdades sucesoras**************************/
                        long id = 0;
                        Actividad aux;
                            if(activities != null)
                            {
                                //limpian dependencias para reasignarlas nuevamente
                                for(Actividad activity : actividad.getDependencias())
                                {
                                    activity.dropSucesora(actividad);
                                    ma.exec(activity, IProjectManager.UPDATE);
                                }
                                actividad.getDependencias().clear();
                                for(String sid : activities)
                                {
                                    id = Long.valueOf(sid);
                                    if(actividad.getFechaInicio().before(ma.getActividad(id).getFechaEntrega()) != true)
                                    {
                                        aux = ma.getActividad(id);
                                        aux.addSucesora(actividad);
                                        ma.exec(aux,IProjectManager.UPDATE);
                                        ma.getActividad(id).getSucesoras().add(actividad);
                                        actividad.getDependencias().add(ma.getActividad(id));
                                    }
                                }
                            }
                        /*****************Se asignan dependencias y activdades sucesoras**************************/
                        IProjectManager manager = new IProjectManager();
                        manager.exec(actividad, IProjectManager.UPDATE);
                        request.getRequestDispatcher("VistaLider").forward(request,response);
                    }else
                    {
                        response.getWriter().print("ERROR: La Fecha de terminaccion no puede ser menor a la de inicio");
                        response.getWriter().print((new Date()).toString());
                    }
                }else
                {
                    response.getWriter().print("ERROR: La Fecha de Comienzo no puede ser menor a la actual");
                    response.getWriter().print((new Date()).toString());
                }
            }
    }
    
    public void deleteActivity(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException
    {
        String idact = request.getParameter("tbid");
        ActivitiesManager ma = new ActivitiesManager();
        UserManager manager = new UserManager();
        Actividad actividad = ma.getActividad(Long.valueOf(idact));

            if(actividad != null)
            {
                IntegranteProyecto integrante = actividad.getResponsable();
                integrante.removeActivity(actividad);
                    manager.exec(integrante, IProjectManager.UPDATE);
                for(Actividad activity : actividad.getDependencias())
                {
                    activity.dropSucesora(actividad);
                    ma.exec(activity, IProjectManager.UPDATE);
                }
                //actividad.setResponsable(null);
                actividad.getSucesoras().clear();
                ma.exec(actividad, IProjectManager.UPDATE);
                //actividad = ma.getActividad(actividad.getId());
                ma.exec(actividad, IProjectManager.DELETE);
            }
            request.getRequestDispatcher("VistaLider").forward(request,response);
    }

    @Override
    public String getServletInfo() {
        return "Control de Actividades";
    }
    
    public void updateAdvance(HttpServletRequest request,HttpServletResponse response,String actividad)throws ServletException, IOException{
        System.out.print(actividad);
        HttpSession user = request.getSession();
        ActivitiesManager manager = new ActivitiesManager();
        Actividad update = manager.getActividad(Long.valueOf(actividad));
        update.setEstado(true);
        manager.exec(update,IProjectManager.UPDATE);
        request.removeAttribute("actividades");
        request.removeAttribute("Aceptar");
        request.getRequestDispatcher("VistaLider").forward(request, response);
    }

}
